﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Distributed;

namespace NETCORE.Redis.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        protected RedisCache redisCache;

        public TestController(RedisCache redisCache)
        {
            this.redisCache = redisCache;
        }


        [HttpGet]
        [Route("Get1")]
        public IActionResult Get1()
        {
            bool isExisted;
            isExisted = redisCache.Exist("abc");//查询键值"abc"是否存在
            redisCache.Remove("abc");//删除不存在的键值"abc"，不会报错

            string key = "Key01";//定义缓存键"Key01"
            string value = "This is a demo key !";//定义缓存值

            redisCache.Set(key, value, new DistributedCacheEntryOptions()
            {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
            });//设置键值"Key01"到Redis，使用绝对过期时间，AbsoluteExpirationRelativeToNow设置为当前系统时间10分钟后过期

            //也可以通过AbsoluteExpiration属性来设置绝对过期时间为一个具体的DateTimeOffset时间点
            //redisCache.Set(key, value, new DistributedCacheEntryOptions()
            //{
            //    AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)
            //});//设置键值"Key01"到Redis，使用绝对过期时间，AbsoluteExpiration设置为当前系统时间10分钟后过期

            var getVaue = redisCache.Get<string>(key, out isExisted);//从Redis获取键值"Key01"，可以看到getVaue的值为"This is a demo key !"

            value = "This is a demo key again !";//更改缓存值

            redisCache.Set(key, value, new DistributedCacheEntryOptions()
            {
                SlidingExpiration = TimeSpan.FromMinutes(10)
            });//将更改后的键值"Key01"再次缓存到Redis，这次使用滑动过期时间，SlidingExpiration设置为10分钟

            getVaue = redisCache.Get<string>(key, out isExisted);//再次从Redis获取键值"Key01"，可以看到getVaue的值为"This is a demo key again !"

            //下面我们来演示如何将键值"Key01"在Redis中设置为永不过期
            redisCache.Remove(key);//首先要从Redis中删除键值"Key01"，因为.NET Core无法将一个有绝对过期时间或滑动过期时间的键值在Redis中设置为永不过期，我们只能将键值"Key01"先从Redis中删除，然后重新添加键值"Key01"到Redis

            redisCache.Set(key, value, new DistributedCacheEntryOptions()
            {
                AbsoluteExpiration = null,
                AbsoluteExpirationRelativeToNow = null,
                SlidingExpiration = null
            });//在添加键值"Key01"到Redis时，只要将DistributedCacheEntryOptions类的AbsoluteExpiration、AbsoluteExpirationRelativeToNow、SlidingExpiration三个属性都设置为null，那么键值"Key01"在Redis中就没有过期时间，也就是永不过期。
               //这时可以在redis-cli中，使用指令："ttl <键名称>"，查看到键值"Key01"的剩余时间为-1，表示没有过期时间，永不过期。

            redisCache.Set(key, value, new DistributedCacheEntryOptions()
            {
                AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30)
            });//虽然.NET Core无法将Redis中有绝对过期时间或滑动过期时间的键值设置为永不过期，但是却可以将一个永不过期的键值设置为有绝对过期时间或滑动过期时间，取消永不过期，只需调用Set方法，将DistributedCacheEntryOptions类的AbsoluteExpiration、AbsoluteExpirationRelativeToNow、SlidingExpiration三个属性之一赋值即可。

            redisCache.Remove(key);//从Redis中删除键值"Key01"




            return Ok("okk");
        }
    }
}
